#include "teacher.h"
#include "tools.h"
#include "struct.h"

void tch_login(void)
{

	system("clear");
	char key[17]={};
	char key2[17]={};
	int id;
	load_tch();//打开文件
	for(;;)
	{
		printf("请输入工号：\n");
		scanf("%d",&id);
		int j;
		for(j=0;j<TEA_MAX;j++)
		{
			if(tea[j].id==id)//判断id
			{
				if(tea[j].state=='2')
				{
					show_msg("教师已离职！\n",2);
					return;
				}
				if(tea[j].lock>=3)
				{
					show_msg("账户锁定，请找校长解锁-------\n",3);
					return;
				}
				else if(tea[j].lock<3)//三次以内
				{
					printf("(友情提示：密码长度６～１６，可包含数字、字母)\n");
					printf("请输入密码\n");
					get_pw(key);//让密码隐形
					if(0!=strcmp(key,tea[j].pw))//密码不正确
					{
						printf(" \n密码错误!\n");
						tea[j].lock++;
						save_tch();
						anykey_continue();
						return;					
					}
					if(strcmp(key,tea[j].pw)==0)//pw正确
					{
						if(strcmp(tea[j].pw,TEA_INI_PW)==0)//判断是否还是初始密码
						{
							printf("请修改初始密码!\n");
							printf("(友情提示：密码长度６～１６，可包含数字、字母)\n");
							printf("请输入新密码:\n");
							get_pw(key);
							printf("\n请再次确认密码\n");
							get_pw(key2);
							if(strcmp(key,key2)==0)//判断两次密码
							{
								if(strcmp(TEA_INI_PW,key2)==0)
								{
									printf("密码不能与初始密码相同！\n");
									break;
								}
								else
								{
									strcpy(tea[j].pw,key);//存入新密码
									save_tch();//保存文件
									menu();
									return;
								}
							}
							else
							{
								printf("两次密码不一致\n");
								break;
							}
						}
						else
						{
							menu();
							return;
						}
					}
				}
			}
			if(!tea[j].sex)
			{
				show_msg("查无此人\n",1);
				return;
			}
		}	
	}
}

void tea_exit(void)
{
	return;
}
void menu(void)
{	
	load_in_stu();
	load_out_stu();
	for(;;)
	{
		system("clear");
		puts("------欢迎进入吴凯牌老师子系统------");
		puts("|         1、添加学生             |");
		puts("|         2、删除学生             |");
		puts("|         3、查找学生             |");
		puts("|         4、修改学生信息         |");
		puts("|         5、录入学生成绩         |");
		puts("|         6、重置学生密码         |");
		puts("|         7、显示所有在校学生信息 |");
		puts("|         8、显示所有退出学生信息 |");
		puts("|         9、退出                 |");
		puts("-----------------------------------");
		switch(getch())
		{
			case'1':add_stu(); 	break;
			case'2':del_stu(); 	break;
			case'3':find_stu(); break;
			case'4': change_stu(); 	break;
			case'5': input_stu(); 	break;
			case'6': reset_stu(); 	break;
			case'7': show_stu_in(); break;
			case'8': show_stu_out();break;
			case'9': tea_exit();	return;
			
		}
	}
}

// 批量添加
void add_lot_stu(void)
{
	load_in_stu();
	load_out_stu();
	char address[30]={};
	int cnt=0;
	printf("请输入文件名：");
	scanf("%s",address);
	FILE* frp_inin_stu = fopen(address,"r");
	if(NULL == frp_inin_stu)
	{
		perror("fopen");
		return;
	}
		while( 0 <= fscanf(frp_inin_stu,"%s %c\n",stu[count_stu].name,&stu[count_stu].sex))
		{
			strcpy(stu[count_stu].pw,STU_INI_PW);
			stu[count_stu].id=count_stu + STU_INI_ID;
			stu[count_stu].lock=0;
			stu[count_stu].chn=0;
			stu[count_stu].eng=0;
			stu[count_stu].math=0;
			stu[count_stu].state='1';
			count_stu++;
			cnt++;
		}
		fclose(frp_inin_stu);
		save_in_stu();
		if(cnt)
		{
			show_msg("添加成功！",2);
		}
		else
		{
			show_msg("导入失败！",2);
		}
		return;
}

// 单个添加
void add_single_stu(void)
{
	system("clear");
		for(;;)
		{
			load_in_stu();
			load_out_stu();//读取离校和在校学生总人数
			printf("输入学生姓名：\n");
			scanf("\n%s",stu[count_stu].name);
			printf("输入学生性别：\n");
			scanf("\n%c",&stu[count_stu].sex);
			stu[count_stu].id=count_stu + STU_INI_ID;//在校人数+20210000
			stu[count_stu].lock=0;
			stu[count_stu].chn=0;
			stu[count_stu].eng=0;
			stu[count_stu].math=0;
			stu[count_stu].state='1';//代表在校
			strcpy(stu[count_stu].pw,STU_INI_PW);
			save_in_stu();
			save_out_stu();
			count_stu++;
			char judge;
			printf("是否继续添加？y/n\n");
			scanf("\n%c",&judge);
			if(judge=='y'||judge=='Y')
			{
				continue;
			}
			else
			{
				return;
			}
		}
	
}
void add_stu(void)//添加学生
{
	for(;;)
	{
		system("clear");
		puts("1、单个学生录入");
		puts("2、批量录入");
		puts("3、退出");
		printf("请输入按键");
		char cmd = getch();
		printf("%c\n",cmd);
		switch(cmd)
		{
			case '1':add_single_stu();break;
			case '2':add_lot_stu();break;
			case '3':return;
		}
	}
		
}
void del_stu(void)//删除学生
{
	load_in_stu();
	load_out_stu();
	system("clear");
	for(;;)
	{
		int id;
		int id2;
		char judge;
		printf("输入学生学号：\n");
		scanf("\n%d",&id);
		printf("再次确认学生学号：\n");
		scanf("\n%d",&id2);
		if(id == id2)//两次学号输入一致
		{
			for(int i=0;i<STU_MAX;i++)
			{	
				if(stu[i].id==id)
				{
						stu[i].state='2';
						save_in_stu();
						save_out_stu();
						show_msg("删除成功！",2);
						return;
				}
			}
			show_msg("查无此人！\n",3);
			return;
		}
		else
		{
			show_msg("学号输入错误,是否重新输入？\n",2);
			stdin->_IO_read_ptr = stdin->_IO_read_end;			
			scanf("%c",&judge);
			if(judge=='y'||judge=='Y')
			{
				continue;
			}
			else
			{
				return; 
			}
		}
	} 
}
void find_stu(void)//查找学生
{
	system("clear");
	for(;;)
	{
		char str[17]={};
		int n;
		int i;
		char judge;
		load_in_stu();
		load_out_stu();
		printf("请准确输入学生姓名或者学号:");
		scanf("%s",str);
		n=atoi(str);
		int cnt=0;
		for(i=0;i<STU_MAX;i++)
		{	
			if((strcmp(str,stu[i].name)==0 || n==stu[i].id )&& stu[i].id)//按姓名或id查找（为防止找出空结构体，要确定id一定存在）
			{
				printf("姓名：%s  性别：%s 在职状态：%s 学号：%d\n 语文：%.1lf 数学：%.1lf 英语：%.1lf \n",stu[i].name,'w'==stu[i].sex?"女":"男",'1'==stu[i].state?"在校":"已离校",stu[i].id,stu[i].chn,stu[i].math,stu[i].eng);
				cnt++;
			}
			if(!stu[i].id && !cnt)
			{
				printf("查无此人\n");
				break;
			}
		}
		printf("是否继续查找？y/n\n");
		scanf(" %c",&judge);
		if(judge=='y'||judge=='Y')
		{
			continue;
		}
		else
		{
			save_in_stu();
			save_out_stu();
			return;
		}
	}
}


void change_stu(void)//修改学生信息
{
	for(;;)
	{
		system("clear");
		printf("1、修改学生基础信息：\n");
		printf("2、修改学生成绩：\n");
		printf("3、退出\n");
		switch(getch())
		{
			case'1': change_basics_stu(); break;
			case'2': change_mark_stu();   break;
			case'3':return;
        }
	}
}
void change_mark_stu(void)//改学生成绩
{
	system("clear");
	int id;
	int i;
	load_in_stu();
	printf("请准确输入学生学号:");
	scanf("%d",&id);
	for(i=0;i<count_stu;i++)
	{
		if(stu[i].id==id)
		{
			printf("姓名：%s  性别：%c 在职状态：%c 学号：%d 语文：%.1lf 数学：%.1lf 英语：%.1lf \n",stu[i].name,stu[i].sex,stu[i].state,stu[i].id,stu[i].chn,stu[i].math,stu[i].eng);
				printf("请按顺序输入语文、数学、英语成绩：");
				scanf("%lf %lf %lf",&stu[i].chn,&stu[i].math,&stu[i].eng);
				save_in_stu();
				show_msg("修改成功",1);
		 		return;	
		}
	}
	show_msg("查无此人",2);	
    return;
}
void change_basics_stu(void)//修改学生基础信息
{
	system("clear");
	int id;
	int i;
	load_in_stu();
	printf("请准确输入学生学号:");
	scanf("%d",&id);
	for(i=0;i<count_stu;i++)
	{
		if(stu[i].id==id)
		{
			printf("姓名：%s  性别：%c 在职状态：%c 学号：%d 语文：%.1lf 数学：%.1lf 英语：%.1lf \n",stu[i].name,stu[i].sex,stu[i].state,stu[i].id,stu[i].chn,stu[i].math,stu[i].eng);
			printf("输入学生姓名、性别:\n");
			scanf("%s %c",stu[i].name,&stu[i].sex);
			save_in_stu();
			show_msg("修改成功",1);
			return;	
		}
		
	}
    show_msg("查无此人",2);	
    return;
}

// 录入学生成绩
void input_stu(void)
{for(;;)
		{
		system("clear");
		puts("1、单个学生录入");
		puts("2、批量录入");
		puts("3、退出");
		printf("请输入按键");
		char cmd = getch();
		printf("%c\n",cmd);
		
		switch(cmd)
		{
			case '1':single_input();break;
			case '2':lot_input();break;
			case '3':return;
		}
		}
}

// 单个学生录入
void single_input(void)
{	
	system("clear");
	int id;
	int i;
	load_in_stu();
	printf("请准确输入学生学号:");
	scanf("%d",&id);
	for(i=0;i<count_stu;i++)
	{
		if(stu[i].id==id)
		{
			printf("姓名：%s  学号：%d 语文：%.1lf 数学：%.1lf 英语：%.1lf \n",stu[i].name,stu[i].id,stu[i].chn,stu[i].math,stu[i].eng);
				printf("请按顺序输入语文、数学、英语成绩：");
				scanf("%lf %lf %lf",&stu[i].chn,&stu[i].math,&stu[i].eng);
				save_in_stu();
				show_msg("修改成功",1);
		 		return;	
		}
	}
	show_msg("查无此人",3);	
    return;
    
}

// 批量录入
void lot_input(void)
{
	load_in_stu();
	load_out_stu();
	char address[30]={};
	char name_inin[20]={};
	int id_inin;
	double chn_inin;
    	double math_inin;
   	double eng_inin;
	int cnt=0;
	printf("请输入文件名：");
	scanf("%s",address);
	FILE* frp_inin_stu = fopen(address,"r");
	if(NULL == frp_inin_stu)
	{
		perror("fopen");
		return;
	}
		while( 0 <= fscanf(frp_inin_stu,"%s %d %lf %lf %lf\n",name_inin,&id_inin,&chn_inin,& math_inin,& eng_inin))
		{
			for(int i=0;i<STU_MAX;i++)
			{
				if(strcmp(name_inin,stu[i].name)==0 && id_inin==stu[i].id)
				{
					stu[i].chn=chn_inin;
					stu[i].math=math_inin;
					stu[i].eng=eng_inin;
					cnt++;
				}
			}
		}
		fclose(frp_inin_stu);
		save_in_stu();
		if(cnt)
		{
			show_msg("添加成功！",2);
		}
		else
		{
			show_msg("添加失败！",2);
		}
		return;
}
// 重置
void reset_stu(void)
{
	load_in_stu();
	load_out_stu();
	char key[20]={};
    for(;;)
    {
        printf("请输入要查找的学生姓名或学号：");
        scanf("%s",key);
		for(int i=0;i<STU_MAX;i++)
        {
            if((!strcmp(key,stu[i].name) || stu[i].id==atoi(key)) && stu[i].id)
            {
                if(stu[i].state=='2')
                {
                    show_msg("该学生已经离校！",3);
                    return;
                }
				strcpy(stu[i].pw,STU_INI_PW);
				stu[i].lock = 0;
				printf("学生 %s 密码已经重置。",stu[i].name);
				save_in_stu();
				save_out_stu();
				anykey_continue();
				return;
			}
			if(!stu[i].id)
            {
                show_msg("没有找到该学生，请确认输入的信息是否正确。",3);
				anykey_continue();
				return;
            }
		}
	}
}

// 显示在校
void show_stu_in(void)
{	
	printf("姓名\t性别\t学号\t\t语文成绩\t数学成绩\t英语成绩\t\n");
	for(int i=0;i<STU_MAX;i++)
	{
		if(!stu[i].id)	break;
		if(stu[i].state=='1') printf("%s\t%s\t%d\t%.1lf\t\t%.1lf\t\t%.1lf\n",stu[i].name,'w'==stu[i].sex?"女":"男",stu[i].id,stu[i].chn,stu[i].math,stu[i].eng);
	}
	anykey_continue();
	return;
}

// 显示离校
void show_stu_out(void)
{	
	printf("姓名\t性别\t学号\t\t语文成绩\t数学成绩\t英语成绩\t\n");
	for(int i=0;i<STU_MAX;i++)
	{
		if(!stu[i].id)	break;
		if(stu[i].state=='2') printf("%s\t%s\t%d\t%.1lf\t\t%.1lf\t\t%.1lf\n",stu[i].name,'w'==stu[i].sex?"女":"男",stu[i].id,stu[i].chn,stu[i].math,stu[i].eng);	
	}
	anykey_continue();
	return;
}
